/*!
 * \file TraderXTP.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief XTP交易接口实现
 * 
 * \details XTP交易接口适配器，基于中泰证券XTP交易系统API实现
 *          提供股票交易的完整功能，支持股票买卖、查询等操作
 *          采用异步回调机制，支持多线程安全操作
 */
#pragma once

#include <stdint.h>
#include <boost/asio/io_context.hpp>
#include <boost/asio/post.hpp>

#include "../API/XTP2.2.32.2/xtp_trader_api.h"

#include "../Includes/ITraderApi.h"
#include "../Includes/WTSCollection.hpp"

#include "../Share/IniHelper.hpp"
#include "../Share/StdUtils.hpp"
#include "../Share/DLLHelper.hpp"

USING_NS_WTP;

/*!
 * \class TraderXTP
 * \brief XTP交易接口实现类
 * 
 * \details XTP交易接口适配器，继承自XTP::API::TraderSpi和ITraderApi
 *          实现WonderTrader统一交易接口，封装XTP API的具体实现
 *          
 *          主要功能：
 *          - XTP交易连接管理：支持交易服务器连接、断线重连
 *          - 用户认证登录：支持用户名密码登录、账户密钥认证
 *          - 股票订单管理：支持股票买卖订单提交、撤单操作
 *          - 持仓查询：支持股票持仓查询、持仓明细查询
 *          - 资金查询：支持账户资金查询、可用资金计算
 *          - 成交查询：支持历史成交查询、实时成交推送
 *          - 数据转换：WonderTrader数据结构与XTP数据结构互转
 *          - 异步处理：支持多线程异步处理，避免阻塞主线程
 *          - 错误处理：完善的错误处理和异常恢复机制
 *          
 *          XTP特色功能：
 *          - 支持中泰证券XTP交易系统的特有功能
 *          - 支持股票现货交易
 *          - 支持快速交易模式
 *          - 支持多账户管理
 *          - 支持实时行情推送
 *          
 * \note 使用前需要先初始化并连接到XTP交易服务器
 * \warning 所有交易操作都是异步的，结果通过回调函数返回
 * \see ITraderApi, XTP::API::TraderSpi
 */
class TraderXTP : public XTP::API::TraderSpi, public ITraderApi
{
public:
	TraderXTP();
	virtual ~TraderXTP();

	/*!
	 * \enum TraderState
	 * \brief 交易接口状态枚举
	 * 
	 * \details 定义XTP交易接口的各种连接和登录状态
	 */
	typedef enum
	{
		TS_NOTLOGIN,		///< 未登录状态
		TS_LOGINING,		///< 正在登录状态
		TS_LOGINED,			///< 已登录状态
		TS_LOGINFAILED,		///< 登录失败状态
		TS_ALLREADY			///< 全部就绪状态，可以进行交易
	} TraderState;

public:
	//////////////////////////////////////////////////////////////////////////
	//XTP::API::TraderSpi 接口实现
	
	/*!
	 * \brief 连接断开回调
	 * \param session_id 会话ID
	 * \param reason 断开原因
	 * 
	 * \details 当与XTP交易服务器连接断开时调用
	 *          更新连接状态，通知上层应用
	 */
	virtual void OnDisconnected(uint64_t session_id, int reason) override;

	/*!
	 * \brief 错误响应回调
	 * \param error_info 错误信息
	 * 
	 * \details 处理XTP API返回的错误信息
	 */
	virtual void OnError(XTPRI *error_info) override;

	/*!
	 * \brief 订单事件回调
	 * \param order_info 订单信息
	 * \param error_info 错误信息
	 * \param session_id 会话ID
	 * 
	 * \details 接收XTP推送的订单状态变化通知
	 *          实时更新订单状态，通知上层应用
	 */
	virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) override;

	/*!
	 * \brief 成交事件回调
	 * \param trade_info 成交信息
	 * \param session_id 会话ID
	 * 
	 * \details 接收XTP推送的成交通知
	 *          实时更新持仓和资金，通知上层应用
	 */
	virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) override;

	/*!
	 * \brief 撤单错误回调
	 * \param cancel_info 撤单信息
	 * \param error_info 错误信息
	 * \param session_id 会话ID
	 * 
	 * \details 接收XTP推送的撤单错误通知
	 */
	virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) override;

	/*!
	 * \brief 订单查询响应回调
	 * \param order_info 订单信息
	 * \param error_info 错误信息
	 * \param request_id 请求ID
	 * \param is_last 是否最后一条
	 * \param session_id 会话ID
	 * 
	 * \details 处理订单查询响应，转换为WonderTrader格式
	 */
	virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) override;

	/*!
	 * \brief 成交查询响应回调
	 * \param trade_info 成交信息
	 * \param error_info 错误信息
	 * \param request_id 请求ID
	 * \param is_last 是否最后一条
	 * \param session_id 会话ID
	 * 
	 * \details 处理成交查询响应，转换为WonderTrader格式
	 */
	virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) override;

	/*!
	 * \brief 持仓查询响应回调
	 * \param position 持仓信息
	 * \param error_info 错误信息
	 * \param request_id 请求ID
	 * \param is_last 是否最后一条
	 * \param session_id 会话ID
	 * 
	 * \details 处理持仓查询响应，转换为WonderTrader格式
	 */
	virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) override;

	/*!
	 * \brief 资金查询响应回调
	 * \param asset 资金信息
	 * \param error_info 错误信息
	 * \param request_id 请求ID
	 * \param is_last 是否最后一条
	 * \param session_id 会话ID
	 * 
	 * \details 处理资金查询响应，转换为WonderTrader格式
	 */
	virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) override;

public:
	//////////////////////////////////////////////////////////////////////////
	//ITraderApi 接口实现
	
	/*!
	 * \brief 初始化XTP交易接口
	 * \param params 初始化参数
	 * \return 成功返回true，失败返回false
	 * 
	 * \details 初始化XTP交易接口，设置连接参数
	 *          必需参数：
	 *          - host: XTP交易服务器地址
	 *          - port: XTP交易服务器端口
	 *          - user: 用户名
	 *          - pass: 密码
	 *          - acckey: 账户密钥
	 *          
	 *          可选参数：
	 *          - client: 客户端ID
	 *          - quick: 是否快速模式
	 *          - flowdir: 流文件目录
	 *          - xtpmodule: XTP动态库模块名
	 */
	virtual bool init(WTSVariant *params) override;

	/*!
	 * \brief 释放XTP交易接口资源
	 * 
	 * \details 清理所有资源，断开连接，停止工作线程
	 *          释放XTP API对象，清理数据缓存
	 */
	virtual void release() override;

	/*!
	 * \brief 注册交易事件监听器
	 * \param listener 事件监听器指针
	 * 
	 * \details 设置交易事件的回调处理器
	 *          用于接收交易相关的事件通知
	 */
	virtual void registerSpi(ITraderSpi *listener) override;

	/*!
	 * \brief 连接到XTP服务器
	 * 
	 * \details 建立与XTP交易服务器的连接
	 *          启动异步处理工作线程
	 */
	virtual void connect() override;

	/*!
	 * \brief 断开与XTP服务器的连接
	 * 
	 * \details 安全断开连接并清理资源
	 *          停止工作线程，释放API对象
	 */
	virtual void disconnect() override;

	/*!
	 * \brief 检查连接状态
	 * \return 已连接返回true，未连接返回false
	 * 
	 * \details 检查与XTP服务器的连接状态
	 */
	virtual bool isConnected() override;

	/*!
	 * \brief 生成委托单号
	 * \param buffer 输出缓冲区
	 * \param length 缓冲区长度
	 * \return 成功返回true，失败返回false
	 * 
	 * \details 生成唯一的委托单号标识
	 *          格式：会话ID_订单引用号
	 */
	virtual bool makeEntrustID(char* buffer, int length) override;

	/*!
	 * \brief 用户登录
	 * \param user 用户名
	 * \param pass 密码
	 * \param productInfo 产品信息
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 启动用户登录流程
	 *          使用用户名、密码和账户密钥进行身份验证
	 */
	virtual int login(const char* user, const char* pass, const char* productInfo) override;

	/*!
	 * \brief 用户登出
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 向XTP服务器发送用户登出请求
	 */
	virtual int logout() override;

	/*!
	 * \brief 提交订单
	 * \param eutrust 委托单对象
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 向XTP服务器提交股票交易订单
	 *          支持限价单、市价单等多种订单类型
	 */
	virtual int orderInsert(WTSEntrust* eutrust) override;

	/*!
	 * \brief 订单操作（撤单）
	 * \param action 订单操作对象
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 对已提交的订单进行撤单操作
	 */
	virtual int orderAction(WTSEntrustAction* action) override;

	/*!
	 * \brief 查询资金账户
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 查询投资者资金账户信息
	 *          包括可用资金、总资产、市值等
	 */
	virtual int queryAccount() override;

	/*!
	 * \brief 查询持仓信息
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 查询投资者股票持仓信息
	 *          包括持仓数量、可用数量、成本价等
	 */
	virtual int queryPositions() override;

	/*!
	 * \brief 查询订单信息
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 查询当日所有订单信息
	 *          包括已成交、部分成交、未成交订单
	 */
	virtual int queryOrders() override;

	/*!
	 * \brief 查询成交信息
	 * \return 成功返回0，失败返回错误码
	 * 
	 * \details 查询当日所有成交信息
	 *          包括成交价格、成交数量、成交时间等
	 */
	virtual int queryTrades() override;

private:
	/*!
	 * \brief 重新连接
	 * 
	 * \details 当连接断开时，尝试重新连接到XTP服务器
	 */
	void		reconnect();
	
	/*!
	 * \brief 生成请求ID
	 * \return 唯一的请求ID
	 * 
	 * \details 生成XTP API调用的请求标识，确保线程安全
	 */
	inline uint32_t	genRequestID();

	// 数据对象创建函数
	inline WTSOrderInfo*	makeOrderInfo(XTPQueryOrderRsp* orderField);		///< 创建订单信息对象
	inline WTSEntrust*		makeEntrust(XTPOrderInfo *entrustField);		///< 创建委托对象
	inline WTSTradeInfo*	makeTradeInfo(XTPQueryTradeRsp *tradeField);	///< 创建成交信息对象

	/*!
	 * \brief 生成委托单号
	 * \param orderRef 订单引用号
	 * \return 委托单号字符串
	 * 
	 * \details 根据会话ID和订单引用号生成唯一的委托单号
	 */
	inline std::string		genEntrustID(uint32_t orderRef);

private:
	// XTP API对象
	XTP::API::TraderApi*	_api;			///< XTP交易API对象
	ITraderSpi*		_sink;					///< 交易事件监听器

	// 数据缓存
	typedef WTSHashMap<std::string> PositionMap;
	PositionMap*			_positions;		///< 持仓映射表
	WTSArray*				_trades;		///< 成交数组
	WTSArray*				_orders;		///< 订单数组

	IBaseDataMgr*			_bd_mgr;		///< 基础数据管理器

	// 连接配置参数
	std::string		_user;					///< 用户名
	std::string		_pass;					///< 密码
	std::string		_flowdir;				///< 流文件目录

	std::string		_acckey;				///< 账户密钥

	std::string		_host;					///< 服务器地址
	int				_port;					///< 服务器端口
	int				_client;				///< 客户端ID

	bool			_quick;					///< 是否快速模式

	// 状态管理
	TraderState		_state;					///< 交易状态

	uint64_t		_sessionid;				///< 会话ID
	uint32_t		_tradingday;			///< 交易日
	std::atomic<uint32_t>		_reqid;		///< 请求ID计数器
	std::atomic<uint32_t>		_ordref;	///< 订单引用号计数器

	// 异步处理
	boost::asio::io_context		_asyncio;	///< 异步IO上下文
	StdThreadPtr				_thrd_worker;	///< 工作线程

	// 动态库管理
	DllHandle		m_hInstXTP;				///< XTP动态库句柄
	typedef XTP::API::TraderApi* (*XTPCreator)(uint8_t, const char*, XTP_LOG_LEVEL);
	XTPCreator		m_funcCreator;			///< XTP API创建函数

	IniHelper		_ini;					///< 配置文件助手
};

